package edu.gdpu.bytecode;

/**
 * @author mazebin
 * @date 2021年 07月09日 22:30:12
 */
public class IPlusPlusAndWhileTest {
    public static void main(String[] args) {
        int a=0;
        int i=0;
        while (a<10){
           i= i++;
            a++;
        }
        System.out.println(i);
        /**
         这里按照以前的知识理解，
         首先x是等该语句执行完毕再相加。也就是 x=x=0,x++;
         因此x就变成了1。这样子最后x结果就是10，可实际输出为0
         原因是i++；这句话翻译成指令是从 iload_n(n为局部变量表中的索引)开始的,
         然后局部变量i进行自增运算，执行iinc指令
         然后执行istore_n(n为局部变量表中的索引),又将栈顶的0赋值给局部变量i,从而覆盖了先前的自增运算。


         */
    }
}
/**
 Code:
 stack=2, locals=3, args_size=1
 0: iconst_0   //将0压入栈
 1: istore_1   //0->a
 2: iconst_0  //将0压入栈
 3: istore_2   //0->i
 4: iload_1   //<- a
 5: bipush        10 //将10压入栈
 7: if_icmpge     21 //如果一个int类型值大于或者等于另外一个int类型值，则跳转
 10: iload_2   //<-i 这里是0；
 11: iinc          2, 1 //i++;
 14: istore_2   //将栈顶的0存入 i(0->i)
 15: iinc          1, 1 //a++
 18: goto          4 //跳转到第四
 21: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStr
 eam;
 24: iload_2     //从i读取值压入栈 ,0
 25: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
 28: return
 LineNumberTable:
 line 9: 0
 line 10: 2
 line 11: 4
 line 12: 10
 line 13: 15
 line 15: 21
 line 16: 28
 LocalVariableTable:
 Start  Length  Slot  Name   Signature
 0      29     0  args   [Ljava/lang/String;
 2      27     1     a   I
 4      25     2     i   I

 */
